PROGRAMACIÓN
ORIENTADA A
OBJETOS

“La nueva cultura de desarrollo de software” (Bertrand Meyer)

“Todo es un objeto” (Alan Kay)

“Un objeto tiene estado, comportamiento e identidad” (Grady Booch)



El Paradigma de los Objetos

La Programación Orientada a Objetos (POO) es un paradigma de programación que utiliza los objetos como abstracción principal. Un objeto es un componente software integrado por datos y código. Está formado por varios procedimientos (llamados métodos) mediante los cuales se accede a los datos internos del objeto. Los objetos se comunican entre sí mediante mensajes.

La POO ha emergido con fuerza en los últimos tiempos y se considera como un gran avance en la ingeniería de software, comparable a lo que supuso en su día la programación estructurada. Algunos la han presentado como una panacea y como el “paradigma definitivo”. Por su difusión y popularización se le ha calificado como “La nueva cultura del desarrollo de software” [Meyer, 1990].

El mundo del software está construido principalmente sobre la POO. Esto incluye aplicaciones web, software empresarial, protocolos de red, etc.


Conceptos de la POO
Ventajas de la POO
Inconvenientes de la POO
Historia de la POO
POO vs. POD (Programación Orientada a Datos)

En POO, todo es un objeto, que integra datos (encapsulados) y código (los métodos). En POD todo es un dato: el código y los datos tiene la misma estructura. Esto tiene la ventaja de su flexibilidad, pues permite modificar fácilmente el código y realizar multiprogramación en general. EN POD no hay encapsulación ni polimorfismo.

El ejemplo más representativo es el lenguaje Lisp [Winston & Berthold, 1989], donde datos y código tienen la misma estructura: la lista. Otros ejemplos de POD son los lenguajes Awk y Sed [Dougherty, 1990].


MENTAL y la POO

Comparaciones POO - MENTAL
Ejemplos simples de compartición
  1. ⟨( f(x y) = (x+y x*y) )⟩
    ⟨( g(x) = f(x 3) )⟩


    Se define una función (g) que depende de otra (f).

    g(7) // ev. f(7 3) ev. (7+3 7*3) ev. (10 21)

  2. ⟨( f(x) = (2*x + 1) )⟩
    ⟨( g(x) = (3*x + 5) )⟩
    ⟨( h(x) = (f(x) + g(x) + 7) )⟩


    En este caso, una función está definida a través de dos funciones.

  3. (x = (3 5 7))
    ( y = (a ⟨x⟩ b) // ev. (a (3 5 7) b) ev. (a 357 b)
    ( z = (a ⟨x⟩∪⟨x⟩ b) // ev. (a (3 5 7 3 5 7) b) ev. (a 357357 b)


    En este caso, la expresión x está compartida por y y por z. Cambios en x afectan inmediatamente a y y z.

    (x = (1 2 3)
    y // ev. (a 123 b)
    z // ev. (a 123123 b)


  4. (x = 123)
    (y = 456)
    ( z = (⟨x⟩ ⟨y⟩ ⟨x⟩+⟨y⟩) // ev. (123 456 579)


    En este caso, las expresiones x e y están compartidas por z. Cambios en x y/o y afectan inmediatamente a z.

    (x = 10)
    (y = 20)
    z // ev. (10 20 30)

Ejemplo de clase

Definimos una clase X con la que se pueden crear y modificar conjuntos de números enteros, con los métodos siguientes:
  1. Crear un conjunto C.
  2. Añadir un número a un conjunto C.
  3. Eliminar un número n de un conjunto C.
  4. Sustituir un número n1 por otro n2 de un conjunto C.
  5. Eliminar un conjunto C.
  6. Obtener el valor de un conjunto C.
Los posibles formas de invocar a la clase X son:
  1. X/(CrearConj Nombre Valor)
  2. X/(AñadirNum Nombre n)
  3. X/(EliminarNum Nombre n)
  4. X/(SustituirNum Nombre n1 n2)
  5. X/(EliminarConj Nombre)
  6. X/(ValorConj Nombre)
siendo: Especificación: Ejemplos:

Bibliografía